home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 04 - 1988 / 04.01 Jan 88 / typing battle source / MultiLine Source next >
Encoding:
Text File  |  1987-11-27  |  3.0 KB  |  161 lines  |  [TEXT/PJMM]

  1. {        MultiLine Unit by Steve Sheets 11/15/87        }
  2.  
  3. {    Simple Edit Fields for Multible Keyboards.        }
  4.  
  5. UNIT MultiLine;
  6.  
  7. INTERFACE
  8.  
  9. {Data Type containing Text Str, Prompt Str, Cursor Char, Cursor Width,}
  10. {    Frame Rect, Frame Flag, Horizontal Start Position, Horizontal Current}
  11. {    Postion, Horizontal Prompt Position, Vertical Start Postion.}
  12.     TYPE
  13.         MLRec = RECORD
  14.                 St, Pr : Str255;
  15.                 Cr : char;
  16.                 CW : integer;
  17.                 Fr : rect;
  18.                 FF : boolean;
  19.                 StartH, CurH, PrH, StartV : integer;
  20.             END;
  21.  
  22. {Draws the Rec Edit Field}
  23.     PROCEDURE MLupdate (Rec : MLRec);
  24.  
  25. {Resets the Rec Edit Field, after someone has changed a setting.}
  26.     PROCEDURE MLreset (VAR Rec : MLRec);
  27.  
  28. {Initalize the Rec Edit Field}
  29.     PROCEDURE MLinit (VAR Rec : MLRec;
  30.                                     Prompt : str255;
  31.                                     Tx : str255;
  32.                                     Curs : char;
  33.                                     Box : rect;
  34.                                     FrFlag : boolean);
  35.  
  36. {Handle a Key (Printable Keys & Backspace)}
  37.     PROCEDURE MLchar (VAR Rec : MLRec;
  38.                                     C : char);
  39.  
  40. {Reset the Text Str to S (calls MLReset).}
  41.     PROCEDURE MLtext (VAR Rec : MLRec;
  42.                                     S : str255);
  43.  
  44. IMPLEMENTATION
  45.  
  46.     PROCEDURE MLupdate;
  47.         VAR
  48.             R2 : rect;
  49.     BEGIN
  50.         WITH Rec DO
  51.             BEGIN
  52.                 IF FF THEN
  53.                     BEGIN
  54.                         FrameRect(Fr);
  55.                         R2.left := Fr.left + 1;
  56.                         R2.right := Fr.right - 1;
  57.                         R2.top := Fr.top + 1;
  58.                         R2.bottom := Fr.bottom - 1;
  59.                         EraseRect(R2);
  60.                     END
  61.                 ELSE
  62.                     EraseRect(Fr);
  63.                 MoveTo(StartH, StartV);
  64.                 IF Pr <> '' THEN
  65.                     DrawString(Pr);
  66.                 DrawString(St);
  67.                 IF CW > 0 THEN
  68.                     DrawChar(Cr);
  69.             END;
  70.     END;
  71.  
  72.     PROCEDURE MLreset;
  73.     BEGIN
  74.         WITH Rec DO
  75.             BEGIN
  76.                 CurH := StartH;
  77.                 IF Pr <> '' THEN
  78.                     CurH := CurH + StringWidth(Pr);
  79.                 PrH := CurH;
  80.                 IF St <> '' THEN
  81.                     CurH := CurH + StringWidth(St);
  82.                 IF Cr <> ' ' THEN
  83.                     CW := CharWidth(Cr)
  84.                 ELSE
  85.                     CW := 0;
  86.             END;
  87.         MLupdate(Rec);
  88.     END;
  89.  
  90.     PROCEDURE MLinit;
  91.     BEGIN
  92.         WITH Rec DO
  93.             BEGIN
  94.                 Fr := Box;
  95.                 St := Tx;
  96.                 Pr := Prompt;
  97.                 StartH := Fr.left + 5;
  98.                 StartV := Fr.top + 16;
  99.                 FF := FrFlag;
  100.                 Cr := Curs;
  101.             END;
  102.         MLreset(Rec);
  103.     END;
  104.  
  105.     PROCEDURE MLchar;
  106.         VAR
  107.             Small : str255;
  108.             L : integer;
  109.     BEGIN
  110.         WITH Rec DO
  111.             IF Ord(C) = 8 THEN
  112.                 BEGIN
  113.                     L := Length(St);
  114.                     IF L > 0 THEN
  115.                         BEGIN
  116.                             CurH := CurH - CharWidth(St[L]);
  117.  
  118.                             TextMode(srcBic);
  119.                             MoveTo(CurH, StartV);
  120.                             DrawChar(St[L]);
  121.                             IF CW > 0 THEN
  122.                                 DrawChar(Cr);
  123.  
  124.                             TextMode(srcOr);
  125.                             MoveTo(CurH, StartV);
  126.                             IF CW > 0 THEN
  127.                                 DrawChar(Cr);
  128.                             Delete(St, L, 1);
  129.                         END;
  130.                 END
  131.             ELSE IF (Ord(C) >= 32) THEN
  132.                 BEGIN
  133.                     IF CharWidth(C) + CW + CurH < Fr.right THEN
  134.                         BEGIN
  135.                             MoveTo(CurH, StartV);
  136.                             IF CW > 0 THEN
  137.                                 BEGIN
  138.                                     TextMode(srcBic);
  139.                                     DrawChar(Cr);
  140.                                     TextMode(srcOr);
  141.                                     MoveTo(CurH, StartV);
  142.                                 END;
  143.                             DrawChar(C);
  144.                             CurH := CurH + CharWidth(C);
  145.                             IF CW > 0 THEN
  146.                                 DrawChar(Cr);
  147.  
  148.                             Small := '@';
  149.                             Small[1] := C;
  150.                             St := CONCAT(St, Small);
  151.                         END;
  152.                 END;
  153.     END;
  154.  
  155.     PROCEDURE MLtext;
  156.     BEGIN
  157.         Rec.St := S;
  158.         MLReset(Rec);
  159.     END;
  160.  
  161. END.